package es.antonio.duarte.abrahamAdmin.struts.servlets;

import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import es.antonio.duarte.abrahamAdmin.servicios.InformeServicio;

/**
 * Servlet encargado de generar y enviar el pdf con los informes de mensajes.
 */
public class PdfServlet extends HttpServlet {

   /** Identificador unico de la clase. */
   private static final long serialVersionUID = 840871550480608300L;

   /** Manejador de la traza. */
   private final Log log = LogFactory.getLog(PdfServlet.class);

   /**
    * Ejecución del metodo GET de HTTP. Genera el informe PDF.
    * @param req HttpServletRequest asociado a la peticion HTTP.
    * @param resp HttpServletResponse asociado a la respuesta HTTP.
    * @throws ServletException En caso de error en la ejecucion del servlet
    * @throws IOException En caso de error en el manejo del flujo de datos
    * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
    *      javax.servlet.http.HttpServletResponse)
    */
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
	  OutputStream stream = null;
      logDebug("Entrando en el servlet encargado de la generación de PDF");
      logDebug("Obteniendo WebApplicationContext");
      WebApplicationContext contextoSpring = WebApplicationContextUtils
               .getWebApplicationContext(this.getServletContext());
      logDebug("WebApplicationContext obtenido: " + contextoSpring);
      logDebug("Obteniendo servicio de informes");
      InformeServicio servicio = (InformeServicio) contextoSpring
               .getBean("informeServicio");
      logDebug("Obtenido siguiente servicio de informes: " + servicio);
      logDebug("Escribiendo cabeceras pdf en la response");
      resp.setContentType("application/pdf");
      resp.setHeader("Content-disposition:",
               "attachment; filename=\"mensajes.pdf\"");
      logDebug("PDFServlet Escribiendo en la response");
      stream = resp.getOutputStream();
      try {
    	  servicio.generaInformeDiario(stream, req.getLocale());
    	  logDebug("PDFServlet escrito en la response, cerrando streams...");
    	  stream.flush();
      } catch(IOException e) {
    	  log.error("Problemas al volcar los datos al flujo " + e);
      } finally {
    	  if (stream != null) {
    		  try {
    			  stream.close();
    		  } catch(IOException io) {
    			  throw io;
    		  }
    	  }
      } 
      logDebug("PdfServlet cierre de streams completado");
   }

   /**
    * Realiza la traza.
    * @param mensaje Mensaje a mostrar en la traza
    */
   private void logDebug(String mensaje) {
      if (log.isDebugEnabled()) {
         log.debug(mensaje);
      }
   }
}
